home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks96
/
FinderUndo.sit
/
Finder Undo
/
patches.c
< prev
next >
Wrap
Text File
|
1996-06-22
|
4KB
|
246 lines
// patches.c
#include <A4Stuff.h>
#include "main.h"
#include "patches.h"
extern InitGrafProc oldInitGraf;
extern Pack8Proc oldPack8;
extern MenuSelectProc oldMenuSelect;
extern MenuKeyProc oldMenuKey;
extern SpecialHandlerProc shpChainProc;
extern Boolean igpatched;
////////////////////////////////////////////////////////////
void PatchInitGraf( void )
{
short trap = _InitGraf;
oldInitGraf = (InitGrafProc)
NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
NSetTrapAddress((UniversalProcPtr) MyInitGraf,
trap, (trap & 0x0800) ? ToolTrap : OSTrap);
}
pascal void MyInitGraf( void *globalPtr )
{
InitGrafProc localIGCopy;
EnterCodeResource();
if (igpatched) goto skip;
// make sure we're ok to run
if ( *(LMGetCurApName())!=(-1) && *(LMGetFinderName())!=(-1) &&
!EqualString( LMGetFinderName(), LMGetCurApName(), true, true ) )
goto skip;
// install our ae hooks
InstallAEHooks();
// install finder patches
PatchPack8();
PatchMenuSelect();
PatchMenuKey();
InstallBlankNotification();
// and make sure we only do this once
igpatched = true;
skip:
localIGCopy = oldInitGraf;
ExitCodeResource();
(*localIGCopy) ( globalPtr );
}
void PatchMenuSelect( void )
{
short trap = _MenuSelect;
oldMenuSelect = (MenuSelectProc)
NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
NSetTrapAddress((UniversalProcPtr) MyMenuSelect,
trap, (trap & 0x0800) ? ToolTrap : OSTrap);
}
void PatchMenuKey( void )
{
short trap = _MenuKey;
oldMenuKey = (MenuKeyProc)
NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
NSetTrapAddress((UniversalProcPtr) MyMenuKey,
trap, (trap & 0x0800) ? ToolTrap : OSTrap);
}
void PatchPack8( void )
{
short trap = _Pack8;
oldPack8 = (Pack8Proc)
NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
NSetTrapAddress((UniversalProcPtr) MyPack8,
trap, (trap & 0x0800) ? ToolTrap : OSTrap);
}
/*
4 bytes keyword
4 bytes shp
2 bytes isSysHandler
4 bytes returnaddr
4 <--- link ptr
*/
asm pascal short MyPack8(register short selector:__D0,AEKeyword keyword, SpecialHandlerProc shp,Boolean isSysHandler)
{
long olda4;
long oldd5;
fralloc
move.l a4, olda4
move.l d5, oldd5
move.l d0,d5
jsr SetCurrentA4
move.l d5,d0
cmpi.w #0x500,d0 // installspecialhandler
beq callspechandlerproc
cmpi.w #0x501,d0 // removespecialhandler
beq callspechandlerproc
cmpi.w #0x52d,d0 // getspecialhandler
beq callspechandlerproc
cmpi.w #0xd17,d0 // aesend
beq callaesendproc
bra.s callthru
callaesendproc:
move.l d5,d0
move.l 8(a6),-(sp) // filterproc
move.l 12(a6),-(sp) // idleproc
move.l 16(a6),-(sp) // timeout
move.w 20(a6),-(sp) // send priority
move.l 22(a6),-(sp) // send mode
move.l 26(a6),-(sp) // reply
move.l 30(a6),-(sp) // theevent
jsr MyAESend
lea 26(sp),sp
bra.s callthru
callspechandlerproc:
move.l d5,d0
MOVE.W 8(A6),-(SP)
MOVE.L 10(A6),-(SP)
MOVE.L 14(A6),-(SP)
jsr MyPack8Helper
LEA 10(SP),SP
tst.w d0
bne callthru
nevermind:
MOVEQ #0,D0
move.l olda4, a4
move.l oldd5, d5
frfree
MOVE.L (SP)+,A0
LEA 10(SP),SP
JMP (A0)
callthru:
move.l oldPack8,a0
move.l d5, d0
move.l olda4, a4
move.l oldd5, d5
frfree
jmp (a0)
}
short MyPack8Helper( AEKeyword keyword, SpecialHandlerProc shp, Boolean isSysHandler,
short selector:__D0 ):__D0
{
Boolean suppress = false;
EnterCodeResource();
switch(selector)
{
case 0x500: // install
if ( (keyword == keyPreDispatch) && !isSysHandler)
{
DebugStr( "\psomeone's installing a phac handler...." );
shpChainProc = shp;
suppress = true;
}
break;
case 0x501: // remove
if ( (keyword == keyPreDispatch) && !isSysHandler)
{
DebugStr( "\psomeone's removing a phac handler...." );
if ( shp == shpChainProc)
shpChainProc = nil;
suppress = true;
}
break;
case 0x52d: // get
if ( (keyword == keyPreDispatch) && !isSysHandler)
{
DebugStr( "\psomeone's getting the phac handler...." );
*((SpecialHandlerProc*)shp) = shpChainProc;
suppress = true;
}
break;
}
ExitCodeResource();
if (suppress) return 0;
else return selector;
}